package moro;

/**
 * Sonar device 
 * geimplementeerd als de Laser
 * de visule weergave van de sonar verschilt echter van de Laser
 * tijdens meting sonar verschijnen 5 groter wordende cirkels
 * verwerking metingen als Laser
 * @author bleker
 */
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;

public class Sonar extends Sensors {
    double diameterOval    = 0.0;
    int ovalPosition       = 0;
    int numberOfAnimations = 0;
    double Xpos            = 0;
    double Ypos            = 0;
    int range              = 100;      // maximum range Sonar

    public Sonar(String name, Robot robot, Position localPos, Environment environment) {
        super(name, robot, localPos, environment);
    }

    // draws the device's geometric shape (Oval/Circle) on the graphical interface
    @Override
    public void paint(Graphics g) {
        if (running){
            // 299 komt ongeveer overeen met duur ronddraaien van Laserbeam, is dus even lang
            if (numberOfAnimations < 299){
                // initieel Sonar juist positioneren
                if (numberOfAnimations == 0){
                    // read the robot's current position
                    robot.readPosition(robotPos);
                    
                    // correctie om Sonarpuls vanuit de juiste plaats op de robot te zenden
                    // het referentiepunt/sensor-ijkpunt is middelpunt robot + 20 cm naar voorzijde
                    // bij rotatie robot moet dit punt steeds opnieuw worden bepaald. Volgens Brugali vergelijking 10.2
                    Xpos = (robot.position.getX() + (20 * Math.cos(robot.position.getT()))) - robot.position.getX();
                    Ypos = (robot.position.getY() + (20 * Math.sin(robot.position.getT()))) - robot.position.getY();
                }
                
                // teken 5 steeds groter wordende cirkels in n animatiestappen (water ripple effect)
                double[] circleNumbers = {0, 0.25, 0.50, 0.75, 1.00};
                
                for(double i0: circleNumbers) {
                    ((Graphics2D) g).setColor(fgColor);
                    // x coordinate upper left, y coordinate upper left, width oval, height oval
                    ((Graphics2D) g).drawOval((int)(Math.round(robot.position.getX()) - ovalPosition*i0)+ (int)Xpos,
                                              (int)(Math.round(robot.position.getY()) - ovalPosition*i0)+ (int)Ypos,
                                              (int) Math.round(diameterOval*i0),
                                              (int) Math.round(diameterOval*i0));
                } 
                diameterOval  = (diameterOval + 2)%200;
                ovalPosition  = (ovalPosition + 1)%100;
                numberOfAnimations++;
            }
        } else {
            numberOfAnimations = 0;
        }
    }  
        
    /**
     * let op: Sonar detecteert Opaque Obstacles
     *  dus False retourneren, Sensors gaat dan verder
     * @param obstacle
     * @return
     */
    @Override
    public boolean isOpaqueObstacle(Obstacle obstacle){
        if(obstacle.opaque) {
            return false;
        }
            return true;
    }
    
    /**
     * 
     * @return range of sonar signal
     */
    @Override
    public int getRange() {
        return range;
    }

}
